With the Framer Motion library, we can render animations in our React app easily.
In this article, we’ll take a look at how to get started with Framer Motion.
Motion Components
We can add motion components to add elements that we can animate.
For example, we can write:
import React from "react";
import { motion } from "framer-motion";
export default function App() {
return (
<div className="App">
<motion.div
animate={{ scale: 0.5 }}
style={{ backgroundColor: "red", width: 100, height: 100 }}
/>
</div>
);
}
to create a div that shrinks to half of the size that is specified in the style
prop.
scale
set to 0.5 does the shrinking with animation.
Animation
The animate
prop lets us animate an element.
For example, we can write:
import React from "react";
import { motion } from "framer-motion";
export default function App() {
const variants = {
hidden: { opacity: 0 },
visible: { opacity: 1 }
};
return (
<motion.div
initial="hidden"
animate="visible"
variants={variants}
style={{ backgroundColor: "red", width: 100, height: 100 }}
/>
);
}
to create a div with the motion.div
component.
And we animate from opacity 0 to opacity 1.
The initial
prop has the name of the initial state of the div.
animate
has the name of the style of the div after the animation.
The variants
prop has the variants
object, which specifies the animation style for each state.
Gestures
Framer Motion can direct hover, tap, pan and drag gestures automatically.
So we can do things to an element when these gestures are applied.
For example, we can write:
import React from "react";
import { motion } from "framer-motion";
export default function App() {
return (
<motion.div
drag="x"
dragConstraints={{ left: -100, right: 100 }}
whileHover={{ scale: 1.1 }}
whileTap={{ scale: 0.9 }}
style={{ backgroundColor: "red", width: 100, height: 100 }}
/>
);
}
to let us drag the red div horizontally with the drag
and dragConstraints
props.
drag
set to 'x'
lets us drag horizontally. And dragConstraints
lets us drag within the given bounds.
left
sets the left limit and right
sets the right limit.
whileHover
has the style to change when we hover over the div.
whileTap
lets us change the style when we tap on the div.
MotionValue
We can set motion values to set the style we want.
For example, we can write:
import React from "react";
import { motion, useMotionValue, useTransform } from "framer-motion";
export default function App() {
const x = useMotionValue(0);
const opacity = useTransform(x, [-200, 0, 200], [0, 1, 0]);
return (
<motion.div
style={{ x, opacity, backgroundColor: "red", width: 100, height: 100 }}
drag="x"
/>
);
}
to let us animate the red div by changing the opacity when we drag it.
The useMotionValue
prop creates a reactive property to watch form.
x
is the horizontal position of the div.
The 2nd argument is the distance values.
And the 3rd argument is the opacity values that correspond to the distance values in the 2nd argument.
Conclusion
We can add basic animations with size and opacity changes and drag and drop effects with Framer Motion.